Option Explicit

Private Sub UserForm_Initialize()
    ' 初始化时，将区域框的内容设置为当前被选中的区域/单元格的地址
    rangeBox.text = Selection.Address
End Sub

' 生成某个区域的 truncate sql
Private Sub createRangeTruncateBtn_Click()
    ' 1. 创建 sql 生成器
    Dim sc As SQLCreator
    Set sc = createSqlCreator

    ' 2. 生成 sql
    Dim sqlStr As String
    sqlStr = sc.createTruncateSQL(ActiveSheet, rangeBox.value)

    ' 3. 将 sql 写回 form
    resultBox.text = sqlStr
End Sub

' 生成整个 sheet 的 truncate sql
Private Sub createTruncateBtn_Click()
    ' 1. 创建 sql 生成器
    Dim sc As SQLCreator
    Set sc = createSqlCreator

    ' 2. 生成 sql
    Dim sqlStr As String
    sqlStr = sc.createTruncateSQL(ActiveSheet)

    ' 3. 将 sql 写回 form
    resultBox.text = sqlStr
End Sub

' 生成某个区域的 insert sql
Private Sub createRangeBtn_Click()
    doCreateInsertSql rangeBox.value
End Sub

' 生成整个 sheet 的 insert sql
Private Sub createSheetBtn_Click()
    doCreateInsertSql
End Sub

Private Sub doCreateInsertSql(Optional ByRef rangeStr As String = "")
    ' 1. 创建 sql 生成器
    Dim sc As SQLCreator
    Set sc = createSqlCreator

    ' 2. 生成 sql
    Dim sqlStr As String
    sqlStr = sc.createInsertSQL(ActiveSheet, rangeStr)

    ' 3. 将 sql 写回 form
    resultBox.text = sqlStr
End Sub

Private Function createSqlCreator() As SQLCreator
    ' 1. 创建 sql 生成器
    Set createSqlCreator = New SQLCreator

    ' 2. 配置 sql 生成器
    '    设置: 是否需要在正式的 SQL 前面附加 truncate 语句
    createSqlCreator.needTruncate = needTruncateBox.value
    '    设置: 在生成的 insert sql 中，是否需要列的物理名
    createSqlCreator.needColumnPhyName = needColumnPhyNameBox.value
    '    设置: 表物理名所在行的行号(从 1 开始，这里是 table 起始位置开始计算的行号)
    createSqlCreator.tablePhyNameRowNo = tablePhyNameRowNoBox.value
    '    设置: table 的列物理名行的行号(从 1 开始，这里是 table 起始位置开始计算的行号)
    createSqlCreator.columnPhyNameRowNo = columnPhyNameRowNoBox.value
    '    设置: table 的列类型行的行号(从 1 开始，这里是 table 起始位置开始计算的行号)
    createSqlCreator.columnTypeRowNo = columnTypeRowNoBox.value
    '    设置: table 的第一个数据行的行号(从 1 开始，这里是 table 起始位置开始计算的行号)
    createSqlCreator.dataStartRowNo = dataStartRowNoBox.value
    '    设置: 用来标识表物理名的标题内容
    createSqlCreator.tablePhyNameTitleContent = tablePhyNameTitleContentBox.value
    '    设置: table 定义标题列的列号
    createSqlCreator.defineTitleColNo = defineTitleColNoBox.value

End Function

